
繼第 8 天的「19. Remove Nth Node From End of List」,今天來解 這題!還沒看過第 8 天或再之前天數的朋友,歡迎也去看看~
話不多說,我們開始吧!
給予一個 n x n 的二維陣列,請順時鐘旋轉 90 度。
請直接修改傳入的二維陣列,運算途中不得宣告新的二維陣列。
[[1,2,3],   [[7,4,1],
 [4,5,6], -> [8,5,2],
 [7,8,9]]    [9,6,3]]
在線性代數裡面,向右旋轉90度矩陣為

來自 轉置 和 水平反射 的相乘:
轉置矩陣為行列交換:



得

根據以上證明,在實作的時候就可以進行下列兩步驟
以這個為例
1 2
3 4
先進行轉置,轉置完後為:
1 3
2 4
也就是說
matrix[row][column] 和 matrix[column][row] 交換進行翻轉之後就會得到最後結果:
3 1
4 2
在這一個階段的運算會進行
接著就可以開始寫程式碼了:
class Solution {
    func rotate(_ matrix: inout [[Int]]) {
        let numberOfRows = matrix.count
        
        // 轉置
        for row in 0..<numberOfRows {
            for column in row..<numberOfRows {
                let temp = matrix[row][column]
                matrix[row][column] = matrix[column][row]
                matrix[column][row] = temp
            }
        }
        
        // 水平反射
        for row in 0..<numberOfRows {
            for column in 0..<(numberOfRows/2) {
                let newColumn = numberOfRows - 1 - column
                let temp = matrix[row][column]
                matrix[row][column] = matrix[row][newColumn]
                matrix[row][newColumn] = temp
            }
        }
    }
}
資料集為 n x n ,令 m 為 n x n 的總數。
| Big O | 說明 | |
|---|---|---|
| 時間複雜度 | O(m) | 線性走訪過 matrix | 
| 空間複雜度 | O(1) | 只有宣告常數個變數 | 
如果有什麼問題和回饋歡迎留言一起討論,
今天就到這裡,明天見!